A processor of a computer system utilizes firmware, such as a basic input/output system (BIOS), to start the initial operation of the computer system once it is powered on. During the booting process, the BIOS is operative to manage data flow between an operating system and attached devices. The BIOS is made accessible to the processor on a read-only memory (ROM) such as an erasable programmable read-only memory chip (EPROM). When a computer system is powered on, a processor passes control to the BIOS program, which subsequently loads an operating system or at least key parts of an operating system into random-access memory (RAM), such as from a hard disk drive. The BIOS may store boot block recovery code for determining if firmware is invalid and interrupting the boot operations if the firmware is invalid.
Firmware running in an embedded microcontroller can be divided into two parts: an image having a boot block and an image with operational code having fixed addresses to run from ROM. In operation, boot block code that is implemented to initialize the firmware validates the operational code and then gives control to valid operational code. If the operational code is invalid, a polling method is used to wait for a firmware update (which also may be referred to hereinafter as a “firmware upgrade”) through a single interface. That is, current firmware can only reliably support one interface for polling. During a typical firmware upgrade, an update tool will request through a command to start the firmware update, which will store a signature in the RAM, and then reset the chip. When reset, the microcontroller will start execution from the boot block and the boot block will identify that the reset has occurred due to a request for firmware upgrade and then proceed directly into the polling method to wait for a firmware update.
In existing conventional microcontroller firmware running from random-access memory (RAM), a compiler may not be able to generate re-locatable binary code. In such a configuration, only one image can be used, which has both a boot block and operational code that can only be run from read-only memory (ROM). The operational code running in ROM may not be operational to flash the ROM during its execution.
In the above-described conventional implementation, a firmware update can only be supported over one interface, as the polling method may not be effective and reliable over more than one interface. Furthermore, a reset is required prior to a firmware upgrade, in order to set the signature in the RAM and reset from the operational code to the boot block.
Therefore, a heretofore unaddressed need still exists in the art to address the aforementioned deficiencies and inadequacies.